package com.cy.hui_jie_dan.service;

import com.cy.hui_jie_dan.popj.entity.ChatMessage;
import org.springframework.transaction.annotation.Transactional;

import java.time.Instant;
import java.util.List;

public interface ChatMessageService {
    /**
     * 保存聊天消息到Redis
     */
    void saveMessage(ChatMessage message);

    /**
     * 获取两个用户之间的聊天记录（从Redis）
     */
    List<ChatMessage> getChatHistory(Integer userId1, Integer userId2, Integer limit, String startTime);

    /**
     * 将消息标记为已读（在Redis中）
     */
    void markMessageAsRead(Integer toUserId, Integer fromUserId);

    /**
     * 获取用户未读消息数量（从Redis）
     */
    int getUnreadMessageCount(Integer userId);

    /**
     * 删除消息（在Redis中）
     */
    void deleteMessage(String messageId, Integer userId);

    /**
     * 根据ID获取消息（从Redis）
     */
    ChatMessage getMessageById(String messageId);

    /**
     * 获取用户的所有未读消息（从Redis）
     */
    List<ChatMessage> getUnreadMessages(Integer userId);

    /**
     * 批量标记消息为已读（在Redis中）
     */
    void markMessagesAsRead(List<String> messageIds, Integer userId);

    /**
     * 获取用户与指定联系人的未读消息数量（从Redis）
     */
    int getUnreadMessageCountWithUser(Integer userId, Integer contactId);

    /**
     * 搜索聊天消息（从Redis）
     */
    List<ChatMessage> searchMessages(Integer userId, String keyword);

    /**
     * 删除过期消息
     * @param cutoffDate 截止日期
     * @return 删除的消息数量
     */
    @Transactional
    int deleteExpiredMessages(Instant cutoffDate);

    /**
     * 撤回消息
     * @param messageId 消息ID
     * @param userId 用户ID（必须是消息发送者）
     * @return 是否撤回成功
     */
    boolean recallMessage(String messageId, Integer userId);

    /**
     * 获取用户所有联系人的最后一条消息（从Redis）
     */
    List<ChatMessage> getLastMessages(Integer userId);
}